home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 2.toast / pc / sample code / quicktime / streaming / qtspacketizerreassembler / imaaudiortp / sources / imaaudiopayload.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-28  |  5.7 KB  |  302 lines

  1. /*
  2.     File:        IMAAudioPayload.c
  3.  
  4.     Contains:    Definition of IMAAudioPayload operations
  5.  
  6.     Copyright:    © 1997-1999 by Apple Computer, Inc., all rights reserved.
  7.     
  8. */
  9.  
  10.  
  11.  
  12. #include "IMAAudioPayload.h"
  13. #include <FixMath.h>
  14. #include <Endian.h>
  15.  
  16.  
  17.  
  18. enum    /* fixed header fields */
  19. {
  20.     __kSampleRateWord            = 0,
  21.     __kSampleRateSize            = 4,
  22.     __kSampleRatePosition        = ( sizeof( UInt16 ) << 3 ) - __kSampleRateSize,
  23.     
  24.     __kChannelCountWord            = 0,
  25.     __kChannelCountSize            = 3,
  26.     __kChannelCountPosition        = __kSampleRatePosition - __kChannelCountSize,
  27.     
  28.     __kInterleaveCountWord        = 0,
  29.     __kInterleaveCountSize        = 3,
  30.     __kInterleaveCountPosition    = __kChannelCountPosition - __kInterleaveCountSize,
  31.     
  32.     __kInterleaveIndexWord        = 0,
  33.     __kInterleaveIndexSize        = __kInterleaveCountSize,
  34.     __kInterleaveIndexPosition    = __kInterleaveCountPosition - __kInterleaveIndexSize,
  35.     
  36.     __kInterleaveTailWord        = 0,
  37.     __kInterleaveTailSize        = __kInterleaveCountSize,
  38.     __kInterleaveTailPosition    = __kInterleaveIndexPosition - __kInterleaveTailSize
  39. };
  40.  
  41.  
  42.  
  43. static unsigned long    __gSampleRates[] = {
  44.                             8000,
  45.                             11025,
  46.                             16000,
  47.                             22050,
  48.                             24000,
  49.                             32000,
  50.                             44100,
  51.                             48000 };
  52.  
  53.  
  54.  
  55. enum
  56. {
  57.     __kSampleRateCount = sizeof( __gSampleRates ) / sizeof( *__gSampleRates )
  58. };
  59.  
  60.  
  61.  
  62. static
  63. UInt32
  64. __SetBitField(
  65.     UInt16 *    inStorageUnit,
  66.     UInt32        inPosition,
  67.     UInt32        inSize,
  68.     UInt32        inValue )
  69. {
  70.     UInt32    theMask = ( ( 1L << inSize ) - 1 ) << inPosition;
  71.     
  72.     
  73.     *inStorageUnit =
  74.         EndianU16_NtoB(
  75.             ( EndianU16_BtoN( *inStorageUnit ) & ( ~theMask ) ) |
  76.             ( theMask & ( inValue << inPosition ) ) );
  77.     
  78.     return( inValue & ( theMask >> inPosition ) );
  79. }
  80.  
  81.  
  82.  
  83. static
  84. UInt32
  85. __BitField(
  86.     const UInt16 *    inStorageUnit,
  87.     UInt32            inPosition,
  88.     UInt32            inSize )
  89. {
  90.     return( ( EndianU16_BtoN( *inStorageUnit ) >> inPosition ) & ( ( 1L << inSize ) - 1 ) );
  91. }
  92.  
  93.  
  94.  
  95. UInt32
  96. IMAAudioPayloadChannelCountLimit(
  97.     void )
  98. {
  99.     return( 1L << __kChannelCountSize );
  100. }
  101.  
  102.  
  103.  
  104. UInt32
  105. IMAAudioPayloadInterleaveCountLimit(
  106.     void )
  107. {
  108.     return( 1L << __kInterleaveCountSize );
  109. }
  110.  
  111.  
  112.  
  113. IMAAudioPayload *
  114. IMAAudioPayloadInitialize(
  115.     IMAAudioPayload *    inPayload )
  116. {
  117.     UInt32    theCount = sizeof( *inPayload ) / sizeof( *inPayload->itsFixedHeader );
  118.     
  119.     
  120.     while( theCount )
  121.     {
  122.         --theCount;
  123.         inPayload->itsFixedHeader[ theCount ] = 0;
  124.     }
  125.     
  126.     IMAAudioPayloadSetChannelCount( inPayload, 1 );
  127.     IMAAudioPayloadSetSampleRate( inPayload, 0 );
  128.     IMAAudioPayloadSetInterleaving( inPayload, 1, 0 );
  129.     
  130.     return( inPayload );
  131. }
  132.  
  133.  
  134.  
  135. UInt32
  136. IMAAudioPayloadSetChannelCount(
  137.     IMAAudioPayload *    inPayload,
  138.     UInt32                inChannelCount )
  139. {
  140.     UInt32    theResult;
  141.     
  142.     
  143.     theResult =
  144.         __SetBitField(
  145.             &inPayload->itsFixedHeader[ __kChannelCountWord ], __kChannelCountPosition,
  146.             __kChannelCountSize, inChannelCount - 1 ) + 1;
  147.     
  148.     return( theResult );
  149. }
  150.  
  151.  
  152.  
  153. UnsignedFixed
  154. IMAAudioPayloadSetSampleRate(
  155.     IMAAudioPayload *    inPayload,
  156.     UnsignedFixed        inSampleRate )
  157. {
  158.     UnsignedFixed    theResult;
  159.     UInt32            theRateCode = __kSampleRateCount;
  160.     
  161.     
  162.     do
  163.     {
  164.         --theRateCode;
  165.     }
  166.     while( theRateCode  &&  inSampleRate < Long2Fix( __gSampleRates[ theRateCode ] ) );
  167.     
  168.     theRateCode =
  169.         __SetBitField(
  170.             &inPayload->itsFixedHeader[ __kSampleRateWord ], __kSampleRatePosition,
  171.             __kSampleRateSize, theRateCode );
  172.     
  173.     if( theRateCode < __kSampleRateCount )
  174.         theResult = Long2Fix( __gSampleRates[ theRateCode ] );
  175.     else
  176.         theResult = 0;
  177.     
  178.     return( theResult );
  179. }
  180.  
  181.  
  182.  
  183. UInt32
  184. IMAAudioPayloadSetInterleaving(
  185.     IMAAudioPayload *    inPayload,
  186.     UInt32                inInterleaveCount,
  187.     UInt32                inInterleaveGroupFrameCount )
  188. {
  189.     UInt32    theResult;
  190.     
  191.     
  192.     theResult =
  193.         __SetBitField(
  194.             &inPayload->itsFixedHeader[ __kInterleaveCountWord ],
  195.             __kInterleaveCountPosition, __kInterleaveCountSize,
  196.             inInterleaveCount - 1 ) + 1;
  197.     
  198.     __SetBitField(
  199.         &inPayload->itsFixedHeader[ __kInterleaveIndexWord ], __kInterleaveIndexPosition,
  200.         __kInterleaveIndexSize, 0 );
  201.     
  202.     __SetBitField(
  203.         &inPayload->itsFixedHeader[ __kInterleaveTailWord ], __kInterleaveTailPosition,
  204.         __kInterleaveTailSize, ( inInterleaveGroupFrameCount - 1 ) % theResult );
  205.     
  206.     return( theResult );
  207. }
  208.  
  209.  
  210.  
  211. UInt32
  212. IMAAudioPayloadIncrementInterleaveIndex(
  213.     IMAAudioPayload *    inPayload )
  214. {
  215.     UInt32    theResult;
  216.     
  217.     
  218.     theResult =
  219.         __BitField(
  220.             &inPayload->itsFixedHeader[ __kInterleaveIndexWord ],
  221.             __kInterleaveIndexPosition, __kInterleaveIndexSize );
  222.     
  223.     theResult =
  224.         __SetBitField(
  225.             &inPayload->itsFixedHeader[ __kInterleaveIndexWord ],
  226.             __kInterleaveIndexPosition, __kInterleaveIndexSize,
  227.             ( theResult + 1 ) % IMAAudioPayloadInterleaveCount( inPayload ) );
  228.     
  229.     return( theResult );
  230. }
  231.  
  232.  
  233.  
  234. UInt32
  235. IMAAudioPayloadChannelCount(
  236.     const IMAAudioPayload *        inPayload )
  237. {
  238.     return(
  239.         __BitField(
  240.             &inPayload->itsFixedHeader[ __kChannelCountWord ],
  241.             __kChannelCountPosition, __kChannelCountSize ) + 1 );
  242. }
  243.  
  244.  
  245.  
  246. UnsignedFixed
  247. IMAAudioPayloadSampleRate(
  248.     const IMAAudioPayload *        inPayload )
  249. {
  250.     UnsignedFixed    theResult;
  251.     UInt32            theRateCode;
  252.     
  253.     
  254.     theRateCode =
  255.         __BitField(
  256.             &inPayload->itsFixedHeader[ __kSampleRateWord ],
  257.             __kSampleRatePosition, __kSampleRateSize );
  258.     
  259.     if( theRateCode < __kSampleRateCount )
  260.         theResult = Long2Fix( __gSampleRates[ theRateCode ] );
  261.     else
  262.         theResult = 0;
  263.     
  264.     return( theResult );
  265. }
  266.  
  267.  
  268.  
  269. UInt32
  270. IMAAudioPayloadInterleaveCount(
  271.     const IMAAudioPayload *        inPayload )
  272. {
  273.     return(
  274.         __BitField(
  275.             &inPayload->itsFixedHeader[ __kInterleaveCountWord ],
  276.             __kInterleaveCountPosition, __kInterleaveCountSize ) + 1 );
  277. }
  278.  
  279.  
  280.  
  281. UInt32
  282. IMAAudioPayloadInterleaveIndex(
  283.     const IMAAudioPayload *        inPayload )
  284. {
  285.     return(
  286.         __BitField(
  287.             &inPayload->itsFixedHeader[ __kInterleaveIndexWord ],
  288.             __kInterleaveIndexPosition, __kInterleaveIndexSize ) );
  289. }
  290.  
  291.  
  292.  
  293. UInt32
  294. IMAAudioPayloadInterleaveTail(
  295.     const IMAAudioPayload *        inPayload )
  296. {
  297.     return(
  298.         __BitField(
  299.             &inPayload->itsFixedHeader[ __kInterleaveTailWord ],
  300.             __kInterleaveTailPosition, __kInterleaveTailSize ) );
  301. }
  302.